<?php
class units {
  function __construct() {
  }

  public function select() {
  
    $data = new jqGridData();
    try
    {
// Только зарегистрированные пользователи могут видеть данные
		if( !isset($_SESSION['user_id']) || $_SESSION['user_id'] == 0 )
			throw new Exception(ERR_M::TIMEOUT_ERROR, 999);

		$rwd = $_SESSION['priv']->units->rwd;
		if( !$rwd  ) throw new Exception(ERR_M::DATA_ACC_DISABLED, 99);

// Проверяем данные
        $page    = ( isset($_REQUEST["page"]) && $_REQUEST["page"] > 0 ) ? $_REQUEST["page"] : 1;
        $limit    = ( isset($_REQUEST["rows"]) && $_REQUEST["rows"] > 0 ) ? $_REQUEST["rows"] : 1;
        $sidx    = ( isset($_REQUEST["sidx"]) && $_REQUEST["sidx"] != '' ) ? $_REQUEST["sidx"] : 'uni_name';
        $sord    = ( isset($_REQUEST["sord"]) && strtolower($_REQUEST["sord"]) == 'desc' ) ? 'DESC' : 'ASC';
        $search    = ( isset($_REQUEST["_search"]) && strtolower($_REQUEST["_search"]) == 'true') ? true : false;
 
// Открываем базу данных
		$db = App::me()->dbOpen();	

/*
SELECT uni_id, uni_name, uni_full, uni_met_id, met.met_name AS met_name,
		IFNULL(uni_met_opt_id,'') AS uni_met_opt_id, 
		IFNULL(opt.met_name,'') AS met_opt_name,
		IFNULL(uni_met_mul,'') AS uni_met_mul
FROM `units`
INNER JOIN metrics as met ON met.met_id = units.uni_met_id
LEFT OUTER JOIN metrics as opt ON opt.met_id=units.uni_met_opt_id
WHERE opt.met_name LIKE '%кг%'
*/

		switch( $sidx ) {
			case 'met_name': $sidx = 'met.met_name'; break;
			case 'met_opt_name': $sidx = 'opt.met_name'; break;
		}
		
// Фильтр
        $whc = array();
        if( $search )
        {
            if(isset($_REQUEST["uni_id"]) && is_numeric($_REQUEST["uni_id"]) ) {
				$whc[] = "uni_id=" . $db->quote($_REQUEST["uni_id"]);
		    }
            
            if(isset($_REQUEST["uni_name"]) && $_REQUEST["uni_name"] != "") {
		    	$whc[] = "uni_name LIKE " . $db->quote("%".$_REQUEST["uni_name"]."%");
            }
			
            if(isset($_REQUEST["uni_full"]) && $_REQUEST["uni_full"] != "") {
		    	$whc[] = "uni_full LIKE " . $db->quote("%".$_REQUEST["uni_full"]."%");
            }
			
            if(isset($_REQUEST["met_name"]) && $_REQUEST["met_name"] != "") {
		    	$whc[] = "met.met_name LIKE " . $db->quote("%".$_REQUEST["met_name"]."%");
            }
			
            if(isset($_REQUEST["met_opt_name"]) && $_REQUEST["met_opt_name"] != "") {
		    	$whc[] = "opt.met_name LIKE " . $db->quote("%".$_REQUEST["met_opt_name"]."%");
            }
			
            if(isset($_REQUEST["uni_met_mull"]) && $_REQUEST["uni_met_mull"] != "") {
		    	$whc[] = "uni_met_mull = " . $db->quote($_REQUEST["uni_met_mull"]);
            }
			
		}

// Фильтр привилегий
		if( $rwd & PERM_BITS::READ_OTH ) $whc[] = '1 = 1';
		elseif( $rwd & PERM_BITS::READ_GRP ) 
			$whc[] = 'uni_user_id IN (SELECT user_id FROM users WHERE cat_id = '.$_SESSION['cat_id'].')';
		elseif( $rwd & PERM_BITS::READ_OWN ) $whc[] = 'uni_user_id = '.$_SESSION['user_id'];
		else $whc[] = '1 = 0';
		
        $whereclaus = (count($whc) != 0 ) ? " WHERE " . implode(" AND ", $whc) : "";
		unset($whc);
            
// Получаем количество записей с учетом фильтра
        $joins = 
                " INNER JOIN metrics AS met ON met.met_id = units.uni_met_id ".
                " LEFT JOIN metrics AS opt ON opt.met_id = units.uni_met_opt_id ";
            
        $sqlreq = "SELECT COUNT(*) AS count FROM units ".$joins.$whereclaus;
        $recset = $db->query( $sqlreq );
		$row = $recset->fetch(PDO::FETCH_ASSOC);
		$count = $row['count'];
		$recset->closeCursor();
            
// Пустая таблица
        if ($count == 0)
			throw new Exception(ERR_M::SUCCESS, 0);
            
// Рассчитаем сколько всего страниц займут данные в БД
    	if( $count > 0 && $limit > 0) {
    		$total_pages = ceil($count/$limit);
    	} else {
    		$total_pages = 0;
    	}                  
 
		if ($page > $total_pages) $page=$total_pages;                  
 
		$start = $limit*$page - $limit;                   
		if($start < 0) $start = 0;                  
 
// Формируем запрос
		$sqlreq = 	"SELECT uni_id, uni_name, uni_full, uni_met_id, met.met_name AS met_name, ".
							"IFNULL(uni_met_opt_id,'') AS uni_met_opt_id, ".
							"IFNULL(opt.met_name,'') AS met_opt_name, ".
							"IFNULL(uni_met_mul,'') AS uni_met_mul ".
					"FROM units ".$joins.$whereclaus." ORDER BY ".$sidx." ".$sord.
		            " LIMIT ".$start.", ".$limit;

		$recset = $db->query($sqlreq);                  
 
// Формирование объекта для возврата
        
    	$data->page      = $page;
    	$data->total     = $total_pages;
    	$data->records   = $count;
    		
    // Строки данных для таблицы
		$i = 0;
		while($row = $recset->fetch(PDO::FETCH_ASSOC)) {
		
			$data->rows[$i]['id'] = $row['uni_id'];
			$data->rows[$i]['cell'] = array(
					$row['uni_id'],
					$row['uni_name'],
					$row['uni_full'],
				    $row['uni_met_id'],
				    $row['met_name'],
				    $row['uni_met_opt_id'],
					$row['met_opt_name'],
				    $row['uni_met_mul']
		    );
		    $i++;
		}
    }
	catch (PDOException $e) {
		$data->userdata->errcode = 1;
		$data->userdata->errmess = ERR_M::DATABASE_ERROR;
	}
    catch ( Exception $e ) {
		$data->userdata->errcode = $e->getCode();
		$data->userdata->errmess = $e->getMessage();
	}
 
	return $data;
  }
  
  
  public function find() {
	$errcode = 0;
	$errmess = '';
    $data = array();
	
    try
    {
// Только зарегистрированные пользователи могут видеть данные
		if( !isset($_SESSION['user_id']) || $_SESSION['user_id'] == 0 )
			throw new Exception(ERR_M::TIMEOUT_ERROR, 999);

// Find - услуга общего пользования. Поэтому, маска должна быть READ_ANY
		$rwd = $_SESSION['priv']->units->rwd;
		if( ( $rwd & PERM_BITS::READ_ANY ) == 0 ) throw new Exception(ERR_M::DATA_OPER_DISABLED, 99);

// Проверяем данные
        $term   = isset($_REQUEST["term"]) ? trim(strip_tags($_REQUEST["term"])) : '';
        if ($term == '')
			throw new Exception(ERR_M::PROTOCOL_ERROR, 1);
   
// Открываем базу данных
		$db = App::me()->dbOpen();	

// Фильтр привилегий
		if( $rwd & PERM_BITS::READ_OTH ) $whs = '1 = 1';
		elseif( $rwd & PERM_BITS::READ_GRP ) 
			$whs = 'uni_user_id IN (SELECT user_id FROM users WHERE cat_id = '.$_SESSION['cat_id'].')';
		elseif( $rwd & PERM_BITS::READ_OWN ) $whs = 'uni_user_id = '.$_SESSION['user_id'];
		else $whs = '1 = 0';
		
// Формируем запрос
		$sqlreq =   "SELECT uni_id, uni_name, uni_full, uni_met_id, met.met_name AS met_name, ".
							"IFNULL(uni_met_opt_id,'') AS uni_met_opt_id, ".
							"IFNULL(opt.met_name,'') AS met_opt_name ".
					"FROM units AS uni ".
					"INNER JOIN metrics AS met ON met.met_id = uni.uni_met_id ".
					"LEFT JOIN metrics AS opt ON opt.met_id = uni.uni_met_opt_id ".
					"WHERE ( uni_name LIKE ".$db->quote("%".$term."%").
					" OR uni_full LIKE ".$db->quote("%".$term."%").' ) AND '.$whs." ORDER BY uni_name";
					
		$recset = $db->query($sqlreq);                  
        while( $row = $recset->fetch(PDO::FETCH_ASSOC) ) {
            $item = new stdClass;
            $item->uni_id = $row['uni_id'];
			
			$num = mb_strlen($term,'UTF-8');
			$pos = mb_stripos( $row['uni_name'], $term, 0, 'UTF-8');
			if( !is_bool($pos) ) {
				$bterm = mb_substr($row['uni_name'], $pos, $num, 'UTF-8');
				$name = preg_replace( '/'.$bterm.'/u', '<b>'.$bterm.'</b>', $row['uni_name'] );				
			} else $name = $row['uni_name'];
			$pos = mb_stripos( $row['uni_full'], $term, 0, 'UTF-8');
			if( !is_bool($pos) ) {
				$bterm = mb_substr($row['uni_full'], $pos, $num, 'UTF-8');
				$full = preg_replace( '/'.$bterm.'/u', '<b>'.$bterm.'</b>', $row['uni_full'] );				
			} else $full = $row['uni_full'];
			
            $item->uni_name = $name;
			$item->uni_full = $full;
			$item->met_id = $row['uni_met_id'];
			$item->met_name = $row['met_name'];
			$item->met_opt_id = $row['uni_met_opt_id'];
			$item->met_opt_name = $row['met_opt_name'];
            $data[] = $item;
        }
        $recset->closeCursor();
 
    }
	catch (PDOException $e) {
		$errcode = 1;
		$errmess = ERR_M::DATABASE_ERROR;
	}
    catch ( Exception $e ) {
		$errcode = $e->getCode();
		$errmess = $e->getMessage();
	}
 
	return array('errcode'=>$errcode,'errmess'=>$errmess, 'data'=>$data);
  }
  
  
  public function getunimet() {
	$errcode = 0;
	$errmess = '';
    $item = new stdClass;
	
    try
    {
// Только зарегистрированные пользователи могут видеть данные
		if( !isset($_SESSION['user_id']) || $_SESSION['user_id'] == 0 )
			throw new Exception(ERR_M::TIMEOUT_ERROR, 999);

// Find - услуга общего пользования. Поэтому, маска должна быть READ_ANY
		$rwd = $_SESSION['priv']->units->rwd;
		if( ( $rwd & PERM_BITS::READ_ANY ) == 0 ) throw new Exception(ERR_M::DATA_OPER_DISABLED, 99);

// Проверяем данные
        $uni_id   = isset($_REQUEST["uni_id"]) ? trim(strip_tags($_REQUEST["uni_id"])) : '';
        if ( !$uni_id || !ctype_digit($uni_id) )
			throw new Exception(ERR_M::PROTOCOL_ERROR, 1);
   
// Открываем базу данных
		$db = App::me()->dbOpen();	

// Фильтр привилегий
		if( $rwd & PERM_BITS::READ_OTH ) $whs = '1 = 1';
		elseif( $rwd & PERM_BITS::READ_GRP ) 
			$whs = 'uni_user_id IN (SELECT user_id FROM users WHERE cat_id = '.$_SESSION['cat_id'].')';
		elseif( $rwd & PERM_BITS::READ_OWN ) $whs = 'uni_user_id = '.$_SESSION['user_id'];
		else $whs = '1 = 0';
		
// Формируем запрос
		$sqlreq =   "SELECT uni_id, uni_met_id, met.met_name AS met_name, ".
							"IFNULL(uni_met_opt_id,'') AS uni_met_opt_id, ".
							"IFNULL(opt.met_name,'') AS met_opt_name ".
					"FROM units AS uni ".
					"INNER JOIN metrics AS met ON met.met_id = uni.uni_met_id ".
					"LEFT JOIN metrics AS opt ON opt.met_id = uni.uni_met_opt_id ".
					"WHERE uni_id = ".$db->quote($uni_id).' AND '.$whs;
					
		$recset = $db->query($sqlreq);                  
        $row = $recset->fetch(PDO::FETCH_ASSOC);
		if( $row ) {
            $item->uni_id = $row['uni_id'];
			$item->met_id = $row['uni_met_id'];
			$item->met_name = $row['met_name'];
			$item->met_opt_id = $row['uni_met_opt_id'];
			$item->met_opt_name = $row['met_opt_name'];
        }
        $recset->closeCursor();
 
    }
	catch (PDOException $e) {
		$errcode = 1;
		$errmess = ERR_M::DATABASE_ERROR;
	}
    catch ( Exception $e ) {
		$errcode = $e->getCode();
		$errmess = $e->getMessage();
	}
 
	return array('errcode'=>$errcode,'errmess'=>$errmess, 'data'=>$item);
  }
  
  
  public function insert() {

    $uni_name		= isset($_POST['uni_name']) ? trim(strip_tags($_POST['uni_name'])) : '';
    $uni_full		= isset($_POST['uni_full']) ? trim(strip_tags($_POST['uni_full'])) : '';
    $uni_met_id		= isset($_POST['uni_met_id']) ? trim(strip_tags($_POST['uni_met_id'])) : '';
    $met_name		= isset($_POST['met_name']) ? trim(strip_tags($_POST['met_name'])) : '';
    $uni_met_opt_id	= isset($_POST['uni_met_opt_id']) ? trim(strip_tags($_POST['uni_met_opt_id'])) : '';
    $uni_met_mul	= isset($_POST['uni_met_mul']) ? trim(strip_tags($_POST['uni_met_mul'])) : '';
	
	$errcode = 0;
	$errmess = '';
    try
    {
// Открываем базу данных
		$db = App::me()->dbOpen();	

// Только зарегистрированные пользователи могут вносить данные
		if( !isset($_SESSION['user_id']) || $_SESSION['user_id'] == 0 )
			throw new Exception(ERR_M::TIMEOUT_ERROR, 999);
		$uni_user_id = $_SESSION['user_id'];
		
//Есть ли разрешение на вставку записей
		$rwd = $_SESSION['priv']->units->rwd;
		if( ($rwd & PERM_BITS::WRITE_OWN) == 0 ) throw new Exception(ERR_M::DATA_OPER_DISABLED, 99);

// Все ли данные переданы
		$errdata = "";
		
// uni_name
		if( $uni_name == '' ) $errdata .= ($errdata?'<br>':'')."- Не указан шифр.";

// uni_full
		if( $uni_full == '' ) $errdata .= ($errdata?'<br>':'')."- Не задано описание.";

// uni_met_id  met_name			
		if( !$met_name ) $errdata .= ($errdata?'<br>':'').'- Не указано название метрики.';
		elseif( !$uni_met_id || !ctype_digit( $uni_met_id ) ) 
			$errdata .= ($errdata?'<br>':'').'- Не указан идентификатор метрики.';
		else {
// Считываем данные метрики из справочника
			$recset = $db->query('SELECT met_name FROM metrics WHERE met_id = '.$db->quote($uni_met_id));                  
			$row = $recset->fetch(PDO::FETCH_ASSOC);
			if( !$row ) {
				$errdata .= ($errdata?'<br>':'').'- Неправильно указан идентификатор метрики.';
			}
			$recset->closeCursor();
		}
		
// uni_met_opt_id  met_opt_name
		if( $uni_met_opt_id ) {
			if( !ctype_digit( $uni_met_opt_id ) || $uni_met_opt_id == $uni_met_id ) 
				$errdata .= ($errdata?'<br>':'').'- Неправильно указан идентификатор доп.метрики.';
			else {
// Проверяем наличие обьекта в справочнике
				$recset = $db->query('SELECT met_name FROM metrics WHERE met_id = '.$db->quote($uni_met_opt_id));                  
				$row = $recset->fetch(PDO::FETCH_ASSOC);
				if( !$row ) {
					$errdata .= ($errdata?'<br>':'').'- Неправильно указан идентификатор доп.метрики.';
				}
				else {
					if( !$uni_met_mul )
						$errdata .= ($errdata?'<br>':'').'- Не указан множитель доп.метрики.';
					else {
						$uni_met_mul = str_replace(',', '.', $uni_met_mul);
						if( !is_numeric( $uni_met_mul ) )
							$errdata .= ($errdata?'<br>':'')."- Неправильно указан множитель.";
					}
				}		
				$recset->closeCursor();
			}
		}
		else $uni_met_mul = '';
//				
// Если есть ошибки - можно уже закончить
//
		if( $errdata ) throw new Exception($errdata, 1);
		
// Может быть платеж уже существует
		$uni_key = preg_replace( '/[^а-яіїa-z0-9]/u', '', mb_strtolower( $uni_name, 'UTF-8') );
		
		$sqlreq =	'SELECT uni_name FROM units WHERE uni_key = '.$db->quote($uni_key);
		$recset = $db->query( $sqlreq );		
		$row = $recset->fetch(PDO::FETCH_ASSOC);
		if( $row ) {
			throw new Exception('В справочнике уже присутствует запись с шифром "'.$row['uni_name'].'"', 1);
        }    
		$recset->closeCursor();

// Пишем данные
        $sqlreq =   'INSERT INTO units ( uni_name, uni_full, uni_met_id, '.
								( $uni_met_opt_id ? 'uni_met_opt_id, uni_met_mul, ':'' ).
								'uni_key, uni_user_id ) '.
                    'VALUES ('. $db->quote($uni_name).", ".$db->quote($uni_full).", ".$db->quote($uni_met_id).", ".
								( $uni_met_opt_id ? $db->quote($uni_met_opt_id).", ".$db->quote($uni_met_mul).", ":'').	
                                $db->quote($uni_key).", ".$db->quote($uni_user_id). ")";
												
		$db->exec($sqlreq);
    }
	catch (PDOException $e) {
		$errcode = 1;
		$errmess = ERR_M::DATABASE_ERROR;
	}
    catch ( Exception $e ) {
		$errcode = $e->getCode();
		$errmess = $e->getMessage();
	}

	return array('errcode'=>$errcode,'errmess'=>$errmess);
  }

  public function update() {

    $uni_id			= isset($_POST['id']) ? trim(strip_tags($_POST['id'])) : '';
    $uni_name		= isset($_POST['uni_name']) ? trim(strip_tags($_POST['uni_name'])) : '';
    $uni_full		= isset($_POST['uni_full']) ? trim(strip_tags($_POST['uni_full'])) : '';
    $uni_met_id		= isset($_POST['uni_met_id']) ? trim(strip_tags($_POST['uni_met_id'])) : '';
    $met_name		= isset($_POST['met_name']) ? trim(strip_tags($_POST['met_name'])) : '';
    $uni_met_opt_id	= isset($_POST['uni_met_opt_id']) ? trim(strip_tags($_POST['uni_met_opt_id'])) : '';
    $uni_met_mul	= isset($_POST['uni_met_mul']) ? trim(strip_tags($_POST['uni_met_mul'])) : '';
	
	$errcode = 0;
	$errmess = '';
    try
    {
// Открываем базу данных
		$db = App::me()->dbOpen();	

// Только зарегистрированные пользователи могут вносить данные
		if( !isset($_SESSION['user_id']) || $_SESSION['user_id'] == 0 )
			throw new Exception(ERR_M::TIMEOUT_ERROR, 999);
		$uni_user_id = $_SESSION['user_id'];
		
// Есть ли разрешение на изменение чьей либо записи
		$rwd = $_SESSION['priv']->units->rwd;
		if( ($rwd & PERM_BITS::WRITE_ANY) == 0 ) throw new Exception(ERR_M::DATA_OPER_DISABLED, 99);
		
// Все ли данные переданы
		$errdata = "";
		
// uni_id
		if( $uni_id == '' ) $errdata .= ($errdata?'<br>':'')."- Не указан идентификатор.";

// uni_name
		if( $uni_name == '' ) $errdata .= ($errdata?'<br>':'')."- Не указан шифр.";

// uni_full
		if( $uni_full == '' ) $errdata .= ($errdata?'<br>':'')."- Не задано описание.";

// uni_met_id  met_name			
		if( !$met_name ) $errdata .= ($errdata?'<br>':'').'- Не указано название метрики.';
		elseif( !$uni_met_id || !ctype_digit( $uni_met_id ) ) 
			$errdata .= ($errdata?'<br>':'').'- Не указан идентификатор метрики.';
		else {
// Считываем данные метрики из справочника
			$recset = $db->query('SELECT met_name FROM metrics WHERE met_id = '.$db->quote($uni_met_id));                  
			$row = $recset->fetch(PDO::FETCH_ASSOC);
			if( !$row ) {
				$errdata .= ($errdata?'<br>':'').'- Неправильно указан идентификатор контрагента.';
			}
			$recset->closeCursor();
		}
		
// uni_met_opt_id  met_opt_name
		if( $uni_met_opt_id ) {
			if( !ctype_digit( $uni_met_opt_id ) || $uni_met_opt_id == $uni_met_id ) 
				$errdata .= ($errdata?'<br>':'').'- Неправильно указан идентификатор доп.метрики.';
			else {
// Проверяем наличие обьекта в справочнике
				$recset = $db->query('SELECT met_name FROM metrics WHERE met_id = '.$db->quote($uni_met_opt_id));                  
				$row = $recset->fetch(PDO::FETCH_ASSOC);
				if( !$row ) {
					$errdata .= ($errdata?'<br>':'').'- Неправильно указан идентификатор доп.метрики.';
				}
				else {
					if( !$uni_met_mul )
						$errdata .= ($errdata?'<br>':'').'- Не указан множитель доп.метрики.';
					else {
						$uni_met_mul = str_replace(',', '.', $uni_met_mul);
						if( !is_numeric( $uni_met_mul ) )
							$errdata .= ($errdata?'<br>':'')."- Неправильно указан множитель.";
					}
				}		
				$recset->closeCursor();
			}
		}
		else $uni_met_mul = '';
//				
// Если есть ошибки - можно уже закончить
//
		if( $errdata ) throw new Exception($errdata, 1);

// Проверяем задействована ли эта запись в других таблицах

		$sql =  "( SELECT 'Справочник типовых спецификаций' as a FROM `specmodel` WHERE spm_uni_id = ".$db->quote($uni_id)." LIMIT 1 ) ".
				"UNION ".
				"( SELECT 'Спецификации к изделиям' as a  FROM `specreal` WHERE spr_uni_id = ".$db->quote($uni_id)." LIMIT 1 ) ".
				"UNION ".
				"( SELECT 'Склад материалов и комплектующих' as a  FROM `stock` WHERE sto_uni_id = ".$db->quote($uni_id)." LIMIT 1 )";
		$rs = $db->query($sql);
		$errdata = '';
		while( $row = $rs->fetch(PDO::FETCH_ASSOC) ) {
			$errdata .= ($errdata?', ':'')."'".$row['a']."'"; 
		}
		$rs->closeCursor();
		if( $errdata != '' )
			throw new Exception( "Запись уже задействована в следующих документах:<br>".$errdata, 1);

		
// Есть ли разрешение на апдейт этой записи
		if( $rwd & PERM_BITS::WRITE_OTH ) $where = '1 = 1';
		elseif( $rwd & PERM_BITS::WRITE_GRP ) 
			$where = 'uni_user_id IN (SELECT user_id FROM users WHERE cat_id = '.$_SESSION['cat_id'].')';
		elseif( $rwd & PERM_BITS::WRITE_OWN ) $where = 'uni_user_id = '.$_SESSION['user_id'];
		else $where = '1 = 0';
		$where .= ' AND uni_id = '.$db->quote($uni_id);
		
		$sqlreq = 'SELECT COUNT(*) AS count FROM units WHERE '.$where.' LIMIT 1';
		$recset = $db->query( $sqlreq );		
		$row = $recset->fetch(PDO::FETCH_ASSOC);
		if( !$row['count'] ) {
			throw new Exception(ERR_M::DATA_OWNER_DISABLED, 99);
        }    
		$recset->closeCursor();
		
// Может быть комплектующее уже существует
		$uni_key = preg_replace( '/[^а-яіїa-z0-9]/u', '', mb_strtolower( $uni_name, 'UTF-8') );
		
		$sqlreq =	'SELECT uni_name FROM units WHERE uni_key = '.$db->quote($uni_key).
					' AND uni_id != '.$db->quote($uni_id);
		$recset = $db->query( $sqlreq );		
		$row = $recset->fetch(PDO::FETCH_ASSOC);
		if( $row ) {
			throw new Exception('В справочнике уже присутствует запись с шифром "'.$row['uni_name'].'"', 1);
        }    
		$recset->closeCursor();

// Пишем данные
        $sqlreq =   'UPDATE units SET '.
						'uni_name = '.$db->quote($uni_name).", ".
						'uni_full = '.$db->quote($uni_full).", ".
						'uni_met_id = '.$db->quote($uni_met_id).", ".
						( $uni_met_opt_id ? 
							'uni_met_opt_id = '.$db->quote($uni_met_opt_id).", ".
							'uni_met_mul = '.$db->quote($uni_met_mul).", "
						:	'uni_met_opt_id = NULL, uni_met_mul = NULL, ' ).
						'uni_key = '.$db->quote($uni_key)." ".
					'WHERE uni_id = '.$db->quote($uni_id);
												
		$db->exec($sqlreq);
    }
	catch (PDOException $e) {
		$errcode = 1;
		$errmess = ERR_M::DATABASE_ERROR;
	}
    catch ( Exception $e ) {
		$errcode = $e->getCode();
		$errmess = $e->getMessage();
	}

	return array('errcode'=>$errcode,'errmess'=>$errmess);
  }


  public function delete() {
    $errmess = "";
	$errcode = 0;
		
    $uni_ids = (isset($_REQUEST['id']) && $_REQUEST['id'] != '') ?
        explode(",", $_REQUEST["id"], 100) : array();

    try
    {
// Только зарегистрированные пользователи могут удалять данные
		if( !isset($_SESSION['user_id']) || $_SESSION['user_id'] == 0 )
			throw new Exception(ERR_M::TIMEOUT_ERROR, 999);

// Есть ли разрешение на удаление хоть какой либо записи
		$rwd = $_SESSION['priv']->units->rwd;
		if( ($rwd & PERM_BITS::DELETE_ANY) == 0 ) throw new Exception(ERR_M::DATA_OPER_DISABLED, 99);
		
        if (!Tools::is_numeric_array( $uni_ids ))
			throw new Exception(ERR_M::PROTOCOL_ERROR, 1);
        
		$uni_id_list = implode(',', $uni_ids);

// Открываем базу данных
		$db = App::me()->dbOpen();	

// Есть ли разрешение на удаление этих записей
		if( $rwd & PERM_BITS::DELETE_OTH ) $where = '1 = 1';
		elseif( $rwd & PERM_BITS::DELETE_GRP ) 
			$where = 'uni_user_id IN (SELECT user_id FROM users WHERE cat_id = '.$_SESSION['cat_id'].')';
		elseif( $rwd & PERM_BITS::DELETE_OWN ) $where = 'uni_user_id = '.$_SESSION['user_id'];
		else $where = '1 = 0';
		$where .= ' AND uni_id IN ('.$uni_id_list.')';
		
		$sqlreq = 'SELECT COUNT(*) AS count FROM units WHERE '.$where;
		$recset = $db->query( $sqlreq );		
		$row = $recset->fetch(PDO::FETCH_ASSOC);
		if( $row['count'] != count($uni_ids) ) {
			throw new Exception(ERR_M::DATA_OWNER_DISABLED, 99);
        }    
		$recset->closeCursor();
		
// Проверяем задействована ли эта запись в других таблицах

		$sql =  "( SELECT 'Справочник типовых спецификаций' as a FROM `specmodel` WHERE spm_uni_id IN (".$uni_id_list.") LIMIT 1 ) ".
				"UNION ".
				"( SELECT 'Спецификации к изделиям' as a  FROM `specreal` WHERE spr_uni_id IN (".$uni_id_list.") LIMIT 1 ) ".
				"UNION ".
				"( SELECT 'Склад материалов и комплектующих' as a  FROM `stock` WHERE sto_uni_id IN (".$uni_id_list.") LIMIT 1 )";
		$rs = $db->query($sql);
		$errdata = '';
		while( $row = $rs->fetch(PDO::FETCH_ASSOC) ) {
			$errdata .= ($errdata?', ':'')."'".$row['a']."'"; 
		}
		$rs->closeCursor();
		if( $errdata != '' )
			throw new Exception( "Удаляемые объекты задействованы в следующих документах:<br>".$errdata, 1);


// Удаляем записи из справочника
        $sqlreq = "DELETE FROM units WHERE uni_id IN (".$uni_id_list.")";
        $db->exec($sqlreq);
	}
	catch (PDOException $e) {
		$errcode = 1;
		$errmess = ERR_M::DATABASE_ERROR;
	}
    catch ( Exception $e ) {
		$errcode = $e->getCode();
		$errmess = $e->getMessage();
	}

	return array('errcode'=>$errcode,'errmess'=>$errmess);
  }
}
?>